package com.wh1200.mybatis.xmlless.dialect

import com.wh1200.mybatis.xmlless.model.FieldMapping
import net.sf.jsqlparser.expression.Function


/**
 * 方言
 * @author 吴昊
 * @date 2023/12/17 13:23
 * @since v4.0.0
 * @version 1.0
 */
interface IDialect {

  /**
   * 生成分页查询条件
   * @param isSpringDataPageable
   * @param pageableParamName
   * @param offsetParam
   * @param sizeParam
   * @return
   */
  fun toLimitSql(
      isSpringDataPageable: Boolean,
      pageableParamName: String?,
      offsetParam: String,
      sizeParam: String
  ): String

  /**
   * 处理sql关键字
   * @param column
   * @return
   */
  fun wrapColumnIfMatchKeywords(column: String): String

  /**
   * 生成判断json数组包含输入值的表达式
   * @param columnResult
   * @param param
   * @return
   */
  fun createJsonArrayElementEqual(columnResult: String, param: String): String

  /**
   * 获取插入或更新的sql模板
   * @return
   */
  fun getInsertOrUpdateTemplate(): String

  /**
   * 获取批量插入或更新的sql模板
   * @return
   */
  fun getBatchInsertOrUpdateTemplate(): String

  /**
   * 生成插入或更新的字段赋值表达式
   *
   * @param column
   * @return
   */
  fun createUpsertFieldSetExpression(column: String): String

  /**
   * 生成join on条件中判断json数组包含输入值的表达式
   *
   * @param column
   * @param value
   * @return
   */
  fun createJoinJsonArrayElementEqual(column: String, value: String): String

  /**
   * 判断日期字段月份相等的条件表达式模板
   *
   * @return
   */
  fun getEqMonthConditionTemplate(): String {
    return "DATE_FORMAT(%s, '%%Y-%%m') %s DATE_FORMAT(%s, '%%Y-%%m')"
  }

  /**
   * 判断日期字段相等的条件表达式模板
   * @return
   */
  fun getEqDateConditionTemplate(): String {
    return "DATE_FORMAT(%s, '%%Y-%%m-%%d') %s DATE_FORMAT(%s, '%%Y-%%m-%%d')"
  }

  /**
   * @param column
   * @param parameterName
   * @param isNumberType
   * @return
   */
  fun createJsonRemoveExpression(column: String, parameterName: String, isNumberType: Boolean): String

  /**
   * @param column
   * @param parameterName
   * @param isNumberType
   * @return
   */
  fun createJsonAddExpression(column: String, parameterName: String): String

  /**
   * @param function
   */
  fun replaceDateFunction(function: Function)

  fun createJsonArrayElementIn(columnResult: String, paramOrValue: String, value: Boolean = false): String

  fun toJsonPath(parentMapping: FieldMapping, relativePath: String): String

}
